import keyboard
import mouse
from time import sleep
import monitor

import static


# Maybe add static in here somewhere?
def send_key(keybind, timeout=0.1, amount=1):
    """
    发送指定按键绑定的按键事件。

    参数:
    keybind: 指定的按键绑定，可以是别名或直接的按键标识。
    timeout: 每次按键后等待的时间，默认为0.1秒。
    amount: 发送按键的次数，默认为1次。

    返回值:
    无
    """

    # 检查是否是按键绑定的别名，如果是，则转换为实际的按键绑定
    keybind = static.tower_keybinds.get(keybind, keybind)
    keybind = static.upgrade_keybinds.get(
        keybind, keybind
    )  # 通过字典链来查找可能的别名映射

    # 循环发送按键指定次数
    for _ in range(amount):
        keyboard.send(keybind)  # 发送按键事件
        sleep(timeout)  # 等待一段时间再发送下一个按键事件


def move_mouse(location, move_timeout=0.1):
    """
    将鼠标移动到屏幕上的特定位置

    @param location: 鼠标需要移动到的位置坐标 (x, y)
    @param move_timeout: 移动鼠标时的超时时间，默认为0.1秒
    """
    # 将鼠标移动到指定的坐标位置
    mouse.move(x=location[0], y=location[1])
    # 延迟一段时间，以便于操作的连贯性
    sleep(move_timeout)


def click(
    location: tuple | tuple,
    amount=1,
    timeout=0.5,
    move_timeout=0.1,
    hold_time=0.075,
    _button="left",
):
    """
    在屏幕的特定位置点击。
    
    @param location: 点击的位置，可以是坐标元组或预定义按钮的名称。
    @param amount: 需要执行的点击次数，默认为1。
    @param timeout: 点击之间的等待时间，默认为0.5秒。
    @param move_timeout: 移动鼠标到目标位置和开始点击之间的等待时间，默认为0.1秒。
    @param hold_time: 按下鼠标键和释放鼠标键之间的等待时间，默认为0.075秒。
    """

    # 如果位置参数是字符串，则认为它是静态按钮，从预定义位置中获取坐标
    if isinstance(location, str):
        location = static.button_positions[location]

    # 将鼠标移动到目标位置
    move_mouse(monitor.scaling(location), move_timeout)

    # 执行指定次数的点击操作
    for _ in range(amount):
        mouse.press(button=_button)  # 按下鼠标按钮
        sleep(
            hold_time
        )  # 为了防止点击过快，造成操作失效，设置短时间的等待
        mouse.release(button=_button)  # 释放鼠标按钮

        # 如果需要进行多次点击，则在每次点击后添加等待时间，防止操作过快
        if amount > 1:
            sleep(timeout)

        sleep(timeout)  # 在每次点击后添加等待时间，以便于操作更加自然
